﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//定义一个学生类型的结构体
struct stu
{
	int age;
	char sex[5];
	char name[20];
	float score;
}s1;

struct Node
{
	int data;
	struct Node* next;
};
/*
1. 第一个成员在与结构体变量偏移量为0的地址处。
2. 其他成员变量要对齐到某个数字（对齐数）的整数倍的地址处。
   对齐数 = 编译器默认的一个对齐数 与 该成员大小的较小值。
   VS中默认的值为8
   不同编译器默认对齐数是不一样的，gcc就没有对齐数
3. 结构体总大小为最大对齐数（每个成员变量都有一个对齐数）的整数倍。
4. 如果嵌套了结构体，被嵌套的结构体对齐到自己的最大对齐数的整数倍处
   最后结构体的整体大小就是所有最大对齐数（含嵌套结构体的对齐数）的整数倍。
*/

int main1()
{
	struct stu s4 = { 18,"male","lisi",78.5 };//按成员变量声明先后进行从初始化
	struct stu s5 = { .score = 72.3,.sex = "male",.name = "wangwu",.age = 16 };//指定顺序初始化
	return 0;
}
int main11()
{
#pragma pack(1) //设置默认对齐数：1
	struct S1
	{
		char c1;//1 1  对齐数：1
		int i;  //4 1  对齐数：1
		char c2; //1 1  对齐数：1
	};
#pragma pack()//取小对齐数是1，还原默认
	printf("sizeof(struct S1)：%d\n", sizeof(struct S1));//6个字节
	struct S2
	{
		char c1;
		char c2;
		int i;
	};
	printf("sizeof(struct S2)：%d\n", sizeof(struct S2));//8
	struct S4
	{
		char c1;     // 1   8    对齐数：1
		struct S2 s3;// 最大对齐数：4， s2大小：8
		double d;    // 8    8    对齐数：8
	};
	printf("sizeof(struct S4)：%d\n", sizeof(struct S4));//24
	
}
struct S
{
	int data[1000];
	int num;
};
struct S s = { {1,2,3,4}, 1000 };
//结构体传参
//注意：形参是对实参的一份临时拷贝
//当struct S这个结构体类型大小非常大的时候，结构体传参的开销是极其大的
//所以一般多用结构体指针来传参
void print1(struct S s)
{
	printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
	printf("%d\n", ps->num);
}
int main2()
{
	print1(s);  //传结构体
	print2(&s); //传地址
	return 0;
}
struct A
{
	int _a : 2;  //占2个比特位
	int _b : 5;  //占5个比特位
	int _c : 10; //占10个比特位
	int _d : 30; //占30个比特位
};
struct S1
{
	char a : 3;  //占3个比特位
	char b : 4;  //占4个比特位
	char c : 5;  //占5个比特位
	char d : 4;  //占4个比特位
};
int main()
{
	printf("sizeof(struct S1):%d\n", sizeof(struct S1));
	return 0;
}